###2025.1.12————第四章 操作列表
# 在本章中，你将学习如何遍历整个列表，只需要几行代码，就能做到
from hmac import digest_size

### 4.1 遍历整个列表
#for 循环
#你经常需要编列列表的所有元素，对每个元素执行相同的操作

# 如果需要对列表中的每个元素都执行相同的操作，可使用 Python 中的 for 循环

# 使用 for循环 打印列表中每一个元素
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician)

#首先，定义了一个列表。接下来，定义一个for循环。
#这行代码让Python 从列表 magicians 中取出一个名字，并将其与变量 magician 相关联。
#最后，让Python 打印前面赋给变量 magician 的名字。
#这这样，对于列表中的每个名字，Python都将重复执行最后两行代码。

###4.1 深入研究for循环

# 循环很重要，因为他是让计算机自动完成重复工作的常见方式之一
# 刚开始使用循环时请牢记，不管列表包含多少个元素，每个元素都将被执行循环指定的步骤。
# 如果列表中包含一百万个元素，那么循环就执行一百万次
# 在编写for循环时，可以依次与列表中的每个值相关联的临时变量指定任意名称，然而，选择描述单个列表元素的有意义的名称大有裨益。
# 例如，对于 小猫列表、小狗列表和一般性列表，像下面这样编写for循环的第一行代码是不错的选择

# for cat in cats:
# for dog in dogs:
# for item in list_of_item:

###4.1.2 在for循环中执行更多的操作
#在for循环中，可以对每个元素执行任意操作

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(f"{magician.title()}, that was a great trick!")

# 相比与前一个实例，唯一不同的是为每位魔术师都打印一条以其名字为抬头的消息。
# 在for 循环中，想包含多少代码都可以。
# 在代码 for magician in magicians 后面，每行缩进的代码都是循环的一部分，将针对列表中的每个值执行一次

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(magician.title()+', that was a great trick!')
    print(f"I can't wait to see your next trick, {magician.title()}.\n")

# 两个函数调用print() 都缩进了，因此他们都将针对列表中的每个元素执行一次

### 4.1.4 在for循环 结束后执行一些操作
# 仅需不缩进即可
#在for循环后面，没有缩进的代码都只执行一次，不会重复执行

magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(f"{magician.title(),}, that was a great trick!")
    #然而，{magician.title(),} 在这里使用了逗号 ,，这会导致 Python 把它当作一个元组（tuple）。也就是说，它会将 magician.title() 和一个空的元素 , 放在一个元组中，而这个元组作为格式化字符串的值插入输出。
    #因为逗号导致了元组的创建，f"{magician.title(),}" 的输出会是元组形式
    print(f"{magician.title()}, that was a great trick!")
    print(f"I can't wait to see your next trick, {magician.title()}.\n")
print('Thank you, everyone. That was a great magic show!')

#使用 for循环处理数据，是一种对数据集执行整体操作的不错方式。
#例如，你可能使用for循环来初始化游戏——遍历角色列表，将每个角色都显示到屏幕上；然后在循环后面添加一些代码，在屏幕上绘制所有角色后显示一个Play Now 按钮

### 4.2 避免缩进错误
# Python 通过缩进来判断代码与程序其他部分的关系
# Python 通过缩进让代码更易读

#当你开始编写必须正确缩进的代码时，需要注意一些常见的 缩进错误
#例如，程序员有时候会将不需要缩进的代码缩进，却忘了缩进必须缩进的代码行

###4.2.1 忘记缩进

#magicians = ['alice', 'david', 'carolina']
#for magician in magicians:
#print(madgician)
#  报错 IndentationError: expected an indented block after 'for' statement on line 77

### 4.2.2 忘记缩进额外的代码行
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
    print(f"{magician.title()}, that was a great trick!")
print(f"I can't wait to see your next trick, {magician.title()}.\n") #此行中 magician显示未定义，但由于在上一行循环中定义了，故将沿用上一行循环中的最后一次循环的magician作为它的值

#这是一个逻辑错误，从语法上来看，这些Python代码是合法的，但由于逻辑错误，结果并不符合预期

### 4.2.3 不必要的缩进
# 如果你不小心缩进了无需缩进的代码行，Python将强调这一点

#message = "Hello Python world!"
#    print(message) # 报错 IndentationError: unexpected indent

### 4.2.4 循环中不必要的缩进
#如果你不小心缩进了应在循环结束后执行的代码，这些代码将针对每个列表元素重复执行
#在一些情况下，Python可能会报告语法错误，但通常只会导致逻辑错误

### 4.2.5 遗漏冒号：

# 如果不小心遗漏了冒号，将导致语法错误，因为Python不知道你想干什么

###4.3 创建数值列表
# 需要存储一组数的原因很多。
# 列表非常适合用于存储数值集合，而Python提供了很多工具，可帮助你高效得处理数值列表。

### 4.3.1 使用range() 函数、

# range() 函数能让你轻松生成一系列的数
for value in range(1, 5):
    print(value)
# range(1, 5) 从指定的第一个值开始，并在达到指定的第二个值时停止，但不会包含第二个值
# 这是编程语言中常见的 差一 行为 的结果
# 即上述循环只会打印 1 2 3 4

# 要打印 1 2 3 4 5 ，必须使用 range(1, 6)
# 使用 range() 时，如果输出不符合预期，请尝试将指定的值加1 或减1.

### 4.3.2 使用 range() 创建数值列表

# 要创建数值列表，可使用 list() 函数将 range() 的结果直接转换为列表
# 如果将 range() 作为 list() 的参数，输出将时一个数值列表

numbers = list(range(1, 6))
print(numbers)

# 在使用range() 函数时，还可以指定步长。 (步长，就是每个数之间的间隔)
# 为此可以给函数 range() 指定第三个参数

even_numbers = list(range(2, 11, 2)) # 步长为2，即这行代码，从2开始，间隔为2，直到 最后一个值11 为止
print(even_numbers)
# 打印 2，4，6，8，10



